import React from 'react';

export default () => {
  let name: string = "Jane";
  let idDeath: boolean = true;
  let age: number = 18;
  let arr: number[] = [1, 2, 3];
  // 元组
  let tuple: [string, number] = ['hello', 10];
  // 枚举
  enum Color {Red, Green, Blue}
  let c: Color = Color.Green;
  let colorName: string = Color[2];
  // any 任意类型
  let notSure: any = 4;
  notSure = "maybe a string instead";
  notSure = false; // okay, definitely a boolean
  let list: any[] = [1, true, "free"];
  list[1] = undefined;
  // Void 只能为它赋予 undefined 和 null
  function warnUser(): void {
    console.log("This is my warning message");
  }
  // undefined
  let u: undefined = undefined;
  // null
  let n: null = null;
  // never 返回never的函数必须存在无法达到的终点
  function error(message: string): never {
    throw new Error(message);
  }
  // object 非原始类型
  function create(o: object | null): void {}
  create({ prop: 0 }); // OK
  create(null); // OK
  // 类型断言 好比其它语言里的类型转换
  let someValue: any = "this is a string";
  // 类型断言 尖括号表示法使用 JSX 时，不行
  // let strLength: number = (<string>someValue).length;
  let strLength: number = (someValue as string).length;
  return (
    <div>
      <h1>基础类型</h1>
      <p>1. 当你指定了--strictNullChecks标记，null和undefined只能赋值给void和它们各自。 这能避免 很多常见的问题。</p>
      <p>2. 在某处你想传入一个 string或null或undefined，你可以使用联合类型string | null | undefined</p>
      <p>3. 类型断言：在使用 JSX 时，尖括号表示法是不行的</p>
    </div>
  );
}
